package com.itheima.reggie.controller;


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

@RestController
@RequestMapping("/common")
@Transactional
@Slf4j
public class CommonController {


    //默认文件下载路径
    @Value("${reggie.path}")
    private String basePath;

    /*
     * 上传文件
     *
     *
     *
     * */
    @PostMapping("/upload")
    public R<String> loadPicture(MultipartFile file) throws IOException {

        //获取文件名
        String originalFilename = file.getOriginalFilename();


        //获取文件类型
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));


        //用UUID算法给文件随机命名
        String fileName = UUID.randomUUID().toString() + substring;

        // Endpoint
        String endpoint = "http://oss-cn-nanjing.aliyuncs.com";
        // 云账号AccessKey有所有API访问权限，建议遵循阿里云安全最佳实践，创建并使用RAM子账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建。
        String accessKeyId = "LTAI5tJXo1yC1sjAynAukWgP";
        String accessKeySecret = "yHxYHOqnslSoEnggTX69jCItEDntRo";

        // 填写Bucket名称，例如examplebucket。
        String bucketName = "reggie-wl";
        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
        String objectName = "downPage/" + fileName;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);


        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, file.getInputStream());
        // 设置该属性可以返回response。如果不设置，则返回的response为空。
        putObjectRequest.setProcess("true");
        // 创建PutObject请求。
        PutObjectResult result = ossClient.putObject(putObjectRequest);
        // 如果上传成功，则返回200。
        System.out.println(result.getResponse().getStatusCode());
//        try {
//
//            //写入文件
//            file.transferTo(new File(basePath + fileName));
//        } catch (IOException e) {
//            e.printStackTrace();
//        }


        System.out.println("==============================" + fileName);

        return R.success(fileName);
    }


    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {
//        try {
////            response.setHeader("Content-Disposition","attachment; filename="+name);
//
//            //确定下载文件类型
//            response.setContentType("image/jpeg");
//
//            //确定文件地址和名称
//            FileInputStream fileInputStream = new FileInputStream(new File(basePath, name));
//
//            //上传文件
//            ServletOutputStream outputStream = response.getOutputStream();
//
//            int len = 0;
//            //构造扩容器，加速
//            byte[] bytes = new byte[1024];
//
//            //文件上传
//            while ((len = fileInputStream.read(bytes)) != -1) {
//                //推流
//                outputStream.write(bytes, 0, len);
//                //刷新通道
//                outputStream.flush();
//            }
//
//            //关闭资源
//            outputStream.close();
//            fileInputStream.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

        response.setHeader("Content-Disposition","attachment; filename="+name);
        response.setContentType("image/jpeg");

        String endpoint = "http://oss-cn-nanjing.aliyuncs.com";
        // 云账号AccessKey有所有API访问权限，建议遵循阿里云安全最佳实践，创建并使用RAM子账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建。
        String accessKeyId = "LTAI5tJXo1yC1sjAynAukWgP";
        String accessKeySecret = "yHxYHOqnslSoEnggTX69jCItEDntRo";

        // 填写Bucket名称，例如examplebucket。
        String bucketName = "reggie-wl";
        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
        String objectName = "downPage/"+name;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);


        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
        try {
            OSSObject ossObject = ossClient.getObject(bucketName, objectName);



            IOUtils.copy(ossObject.getObjectContent(),response.getOutputStream());
            ossObject.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
